package com.naiterui.ehp.bs.doctor.service;

import java.util.List;
import java.util.Map;

import com.naiterui.ehp.bp.support.exception.BusinessException;
import com.naiterui.ehp.bs.doctor.vo.PatientGroupVo;
import com.naiterui.ehp.bs.doctor.vo.PatientUserGroupVo;

public interface IPatientGroupService {

    /**
     * <获取医生的分组患者统计信息>
     * <详细描述>
     *
     * @param doctorId
     *
     * @return
     *
     * @throws BusinessException List<PatiendGroupVo> <返回值描述>
     * @Throws 异常信息
     * @History 2015年6月21日 下午4:27:50 by chenlin
     */
    List<PatientGroupVo> findPatientGroupByDoctorId(Long doctorId);

    /**
     * 根据医生获取患者分组列表
     *
     * @param doctorId    医生ID
     * @param filterEmpty 是否过滤掉空分组
     *
     * @return
     *
     * @throws BusinessException
     * @Description
     * @History 2017年6月28日 by wangchuan
     * @since V2.8.0
     */
    List<PatientGroupVo> findPatientGroupByDoctorId(Long doctorId, boolean filterEmpty);

    /**
     * <新增医生分组>
     * <详细描述>
     *
     * @param doctorId
     * @param name
     *
     * @throws BusinessException void <返回值描述>
     * @Throws 异常信息
     * @History 2015年6月21日 下午4:57:38 by chenlin
     */
    void saveGroup(Long doctorId, String name);

    /**
     * <修改分组>
     * <详细描述>
     *
     * @param doctorId
     * @param groupId
     * @param name     void <返回值描述>
     *
     * @Throws 异常信息
     * @History 2015年6月21日 下午5:19:54 by chenlin
     */
    void updateGroup(Long doctorId, Long groupId, String name) throws BusinessException;

    /**
     * <查询是否已经存在的分组名>
     *
     * @param doctorId
     * @param groupName
     * @param groupId
     *
     * @return
     *
     * @throws BusinessException boolean <返回值描述>
     * @Throws 异常信息
     * @History 2015年7月25日 下午1:44:39 by chenlin
     */
    boolean findExsitGroupName(Long doctorId, String groupName, Long groupId);

    /**
     * <删除分组>
     * <详细描述>
     *
     * @param groupId void <返回值描述>
     *
     * @Throws 异常信息
     * @History 2015年6月21日 下午5:23:59 by chenlin
     */
    void deleteGroup(Long groupId);

    /**
     * 获取分组中的患者信息
     * <详细描述>
     *
     * @param groupId
     *
     * @return
     *
     * @throws BusinessException List<PatientUserGroupVo> <返回值描述>
     * @Throws 异常信息
     * @History 2015年6月21日 下午7:18:16 by chenlin
     */
    List<PatientUserGroupVo> findListUserGroup(Long groupId, Long doctorId) throws Exception;

    /**
     * <向分组中添加患者>
     * <详细描述>
     *
     * @param groupId
     * @param patientIds void <返回值描述>
     *
     * @Throws 异常信息
     * @History 2015年6月21日 下午5:29:03 by chenlin
     */
    void saveUser2Group(Long groupId, String patientIds) throws BusinessException;

    /**
     * <向分组中添加患者>
     * <详细描述>
     *
     * @param groupId
     * @param patientIds void <返回值描述>
     *
     * @Throws 异常信息
     * @History 2015年6月21日 下午5:29:03 by chenlin
     */
    void deleteUser2Group(Long groupId, String patientIds) throws BusinessException;

    /**
     * 查询患者所在的分组列表
     *
     * @param doctorId  医生ID
     * @param patientId 患者ID
     *
     * @return
     *
     * @Description
     * @History 2017年6月11日 by wangchuan
     */
    List<PatientGroupVo> getGroupListByPatient(Long doctorId, Long patientId);

    /**
     * 医生所有的分组，标记出患者所在的分组
     *
     * @param doctorId  医生ID
     * @param patientId 患者ID
     *
     * @return
     *
     * @Description
     * @History 2017年6月11日 by wangchuan
     */
    List<PatientGroupVo> getGroupListByDoctor(Long doctorId, Long patientId);

    /**
     * 向分组中添加或从分组中移除患者
     *
     * @param doctorId  医生ID
     * @param patientId 患者ID
     * @param groupIds  分组ID串，逗号分隔
     *
     * @Description
     * @History 2017年6月12日 by wangchuan
     */
    void updatePatientIncluded(Long doctorId, Long patientId, String groupIds) throws BusinessException;

    /**
     * <pre>
     *     通过医生ID和患者ID获取患者所在医生的医生分组
     * </pre>
     *
     * @param doctorId   医生ID
     * @param patientIds 患者ID集合
     *
     * @return key为患者ID value为分组名称
     */
    Map<Long, List<String>> getGroupNameByDoctorIdAndPatientIds(Long doctorId, List<Long> patientIds);

}